# -*- coding: UTF-8 -*-
'''io顾名思义 input output'''

'''最简单的io print输出到标准输出'''
print("Python is really a great language,", "isn't it?")

'''读取键盘输入

Python提供了两个内置函数从标准输入读入一行文本，默认的标准输入是键盘。如下：
raw_input
input 
说明: input([prompt]) 函数和raw_input([prompt]) 函数基本可以互换
'''

# str = raw_input("请输入：")
# print("你输入的内容是: ", str)
#
# str = input("Enter your input: ")
# print("Received input is : ", str, eval(str))

'''文件open函数
file_object = open(file_name [, access_mode][, buffering])
各个参数的细节如下：

file_name：file_name变量是一个包含了你要访问的文件名称的字符串值。
access_mode：access_mode决定了打开文件的模式：只读，写入，追加等。所有可取值见如下的完全列表。这个参数是非强制的，默认文件访问模式为只读(r)。
buffering:如果buffering的值被设为0，就不会有寄存。如果buffering的值取1，访问文件时会寄存行。如果将buffering的值设为大于1的整数，表明了这就是的寄存区的缓冲大小。如果取负值，寄存区的缓冲大小则为系统默认。
不同模式打开文件的完全列表：

模式	描述
r	以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb	以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
r+	打开一个文件用于读写。文件指针将会放在文件的开头。
rb+	以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w	打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在，创建新文件。
wb	以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在，创建新文件。
w+	打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在，创建新文件。
wb+	以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在，创建新文件。
a	打开一个文件用于追加。如果该文件已存在，文件指针将会放在文件的结尾。也就是说，新的内容将会被写入到已有内容之后。如果该文件不存在，创建新文件进行写入。
ab	以二进制格式打开一个文件用于追加。如果该文件已存在，文件指针将会放在文件的结尾。也就是说，新的内容将会被写入到已有内容之后。如果该文件不存在，创建新文件进行写入。
a+	打开一个文件用于读写。如果该文件已存在，文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在，创建新文件用于读写。
ab+	以二进制格式打开一个文件用于追加。如果该文件已存在，文件指针将会放在文件的结尾。如果该文件不存在，创建新文件用于读写。
'''
'''一句话概括:如果有+则有读写(除了r之外都读到空数据)  r都是从开头开始 如果是a(追加)、w当文件不存在会创建文件，b表示二进制 ,纯写不能读'''

# f = open('test_file.txt', 'r')
# print(dir(f))
# # f.write('one') #不支持写
# print(f.read(10))
# print(f.readline())  # print(f.readline())  # 加了具体的limit就是读多少个字符，否则读整行
# print(f.readlines())  # read、readline 每次调用依次顺序读取
# f.close()

# f = open('test_file.txt', 'rb')
# one = f.readline()
# print(one, one.decode(), str(one, 'UTF-8'),
#       one.decode().encode('UTF-8'),
#       bytes(str(one, 'UTF-8'), 'UTF-8'),
#       )  # bytes str互转
# print(f.readlines())  # read、readline 每次调用依次顺序读取
# f.close()

# f = open('test_file.txt', 'r+')
# print(f.readline())
# f.write('r+')  # 只是读会放到开头，写还是从末尾开始
# # f.seek(0)
# # print(f.readlines())  #read、readline、readlines只能读一次，除非手动seek
# f.close()

f = open('test_file.txt', 'w')
f.write('1\n')
# f.writelines(['two\n', 'three\n'])
f.writelines('\n'.join(['2', '3']))
# print(f.readlines()) #w仅仅支持写
f.close()

# f = open('test_file.txt', 'w+')
# print(f.readlines())  # w+支持读写,但其实文件会先清空,手动seek也无效
# f.write('one\n')
# f.writelines(['two\n', 'three\n'])
# # f.flush()
# f.seek(0)
# print(f.readlines())  # w+支持读写,但其实文件读不到信息,除非手动seek
# f.close()

# f = open('test_file.txt', 'a')
# f.write('a')  # 末尾append
# f.close()

# f = open('test_file.txt', 'a+')
# # f.seek(0)
# print(f.readlines())  # 默认是末尾所以读不到、手动seek可以回到起点
# f.write('a+')  # 末尾append
# f.seek(0)
# print(f.readlines())
# f.close()

# '''python 关闭文件高级姿势'''
# with open('test_file.txt', 'r') as f:
#     print(f.readlines())

'''
file 对象使用 open 函数来创建，下表列出了 file 对象常用的函数：

序号	方法及描述
1	
file.close()

关闭文件。关闭后文件不能再进行读写操作。

2	
file.flush()

刷新文件内部缓冲，直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。

3	
file.fileno()

返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。

4	
file.isatty()

如果文件连接到一个终端设备返回 True，否则返回 False。

5	
file.next()

返回文件下一行。

6	
file.read([size])

从文件读取指定的字节数，如果未给定或为负则读取所有。

7	
file.readline([size])

读取整行，包括 "\n" 字符。

8	
file.readlines([sizehint])

读取所有行并返回列表，若给定sizeint>0，返回总和大约为sizeint字节的行, 实际读取值可能比sizeint较大, 因为需要填充缓冲区。

9	
file.seek(offset[, whence])

设置文件当前位置

10	
file.tell()

返回文件当前位置。

11	
file.truncate([size])

截取文件，截取的字节通过size指定，默认为当前文件位置。
指定长度的话，就从文件的开头开始截断指定长度，其余内容删除；不指定长度的话，就从文件开头开始截断到当前位置，其余内容删除

12	
file.write(str)

将字符串写入文件，返回的是写入的字符。

13	
file.writelines(sequence)

向文件写入一个序列字符串列表，如果需要换行则要自己加入每行的换行符。
'''

# with open('test_file.txt', 'r+') as f:
#     print(f.readlines())
#     print(f.tell())
#     f.seek(0)
#     print(f.tell())
#     print(f.read(12))
#     print(f.tell())
#     print(f.readlines())
#     # print(f.truncate(1))
#     f.seek(0)
#     print(f.truncate())

'''删除文件和重命名,删除需要谨慎操作'''

# os.rename('test_file1.txt', 'test_file.txt') #重命名
# os.remove('test_file2.txt') #删除文件
# if not os.path.exists('test'): os.mkdir("test")  # 创建目录test
# os.rmdir('test')  # 删除目录，不传则删除当前目录
# os.chdir("mysql")  # 更改目录相当于cd命令
# print(os.path.exists('crud'))

'''遍历目录'''
# for i in os.listdir('.'):
#     if os.path.isdir(i):
#         print(os.listdir(i))
#     else:
#         print(i)

# print('+' * 10)
'''迭代遍历'''
# for parent, dirnames, filenames in os.walk('.'):
#     print('*' * 3, parent, '*', dirnames, '*' * 2, filenames)
#     for filename in filenames:
#         file_path = os.path.join(parent, filename)
#         print('文件名：%s' % filename)
#         print('文件完整路径：%s\n' % file_path)
#         print('*' * 10)

#with open('/Users/ywp/Desktop/company_sql.csv', mode='rb') as f:
   # lines = f.readlines()
   # for l in lines:
   #     print(l)
